草庐IT

C++ unique_ptr 和映射

全部标签

c++ - boost::shared_ptr 到 void * 反之亦然

我正在用C语言开发一个应用程序,我需要在其中使用第3方C++库。所以,我基本上是在C++库周围编写一个包装器,以便可以从我的纯C应用程序中调用它。库中的一些方法返回类型为boost::shared_ptr的指针,我需要将其转换为void*[forC]然后将其转换回boost::shared_ptr类型以重用它以进行进一步处理。我使用以下方式进行转换:作废*:void*func1(){//aftertheboost::shared_ptriscreatedreturnstatic_cast(SHARED_PTR.get())}来自void*:voidfunc2(void*VOID_PTR

c++ - 多重映射如何在内部处理重复键?

对于map,我可以理解它被实现为二叉搜索树(例如,红/黑树)及其时间复杂度。但是对于multimaps,如何在内部处理键冲突?是否为具有相同键的所有节点维护了一个列表?或者进行一些其他处理。我遇到了可以使用map>的情况。或multimap并想知道权衡。 最佳答案 C++规范没有给出std::multimap的具体实现,而是给出了对std::multimap的操作速度的要求,并且这些操作应该有什么保证。例如,在multimap上的insert需要将键/值对插入到multimap中,并且必须以一种方式插入在具有相同键的所有现有条目之后

c++ - boost::shared_ptr,ctor 中的一个原子递增,但 dtor 中的两个原子递减?

我正在单步执行boost::shared_ptr的源代码,并且在构造时引用计数器调用一次原子增量。但是,在销毁时我看到原子递减被调用了两次,连接到弱引用?但是,这怎么行呢?在构建时递增一次,在销毁时递减两次,一次在release()中,一次在weak_release()中? 最佳答案 shared_ptr必须维护两个引用计数。一个用于共享实例,一个用于可能通过weak_ptr引用。有了这个,weak_ptr能够增加shared_ptr中的弱引用计数并保持shared_ptr事件(即使在分配的对象被释放之后)以确定从weak_ptr到

c++ - 在没有 C++11 的情况下使用 unique_ptr

这个问题在这里已经有了答案:unique_ptrboostequivalent?(5个答案)关闭7年前。我想将指向d的指针从一个容器传递到下一个容器。在任何时候都不会有超过一个指针的所有者(或d本身)。我希望当最后一个指针超出范围时,自动调用deleted。在C++11中,我将使用unique_ptr来完成此操作。但是,唉,我不能使用C++11。C++中最好的等价物是什么?升压就好了或者,如果没有,处理此问题的适当方法是什么?

c++ - 使用 auto 的函数式 C++ 映射组合器

我正在尝试使用花哨的-std=c++14功能来实现您在函数式语言中看到的“map”组合子(不要与std::map混淆)。我的最终目标是为函数式编程编写一个“外观模式”header,让我在大多数时候忘记副作用和迭代器。我在https://gist.github.com/phatak-dev/766eccf8c72484ad623b找到了一个志同道合的人的帖子.Madhukara版本的map看起来像templateCollectionmap(Collectioncol,unopop){std::transform(col.begin(),col.end(),col.begin(),op);

c++ - 当 RDMA 在映射区域上运行时会发生什么?

RDMA是绕过应用程序和操作系统内核之间无用数据拷贝的有效方法。Mmap是处理大文件的有效方法,就好像它只是一个字节数组一样。我正在使用支持进程间RDMA网络操作的Infiniband上的MPI。每个MPI进程都有一个非常大的文件要与其他进程共享。每个MPI进程能否在每个大文件上创建mmap区域并与其他进程共享?我想让每个进程读取任何进程的任何文件,就好像它通过RDMA(MPI的单向通信)读取它们的内存一样。据我所知,当应用程序调用RDMA操作时,它会将“虚拟内存地址”直接传递给NIC。NIC将处理从虚拟内存地址到其物理内存地址的转换。如果RDMA驱动程序在向NIC发出请求之前固定兴趣

c++ - 是否可以使用填充构造函数创建 std::vector<std::unique_ptr<Bar>> ?

我有一个Foo类,其成员变量类型为std::vector>,我想填写这个类的构造函数的初始化列表。这可能吗?我希望可以使用vector的填充构造函数,就像这样Foo::Foo(intn):vector>(n,unique_ptr(newBar)){}但我认为这需要std::unique_ptr的复制构造函数,它被删除了(因为它应该被删除)(unique_ptr(constunique_ptr&)=delete)。有没有更好的方法来解决这个问题? 最佳答案 既然不可复制,那就搬吧!硬编码对象的解决方案:#include#include

C++11 原子 : does it make sense, 或者甚至可以将它们与内存映射 I/O 一起使用?

据我了解,Cvolatile和用于内存栅栏的可选内联asm已用于在内存映射I/O之上实现设备驱动程序。在Linux内核中可以找到几个示例。如果我们忘记了未捕获异常的风险(如果有的话),用C++11原子替换它们是否有意义?或者,这有可能吗? 最佳答案 通常,您可以用原子替换内存栅栏,但不能用volatile替换内存栅栏,除非它与专门用于线程间通信的栅栏一起使用。关于内存映射I/O,原子性不够的原因是:volatile向您保证程序中对该变量的所有内存访问确实发生并且它们发生(在单个线程中)完全按照您指定的顺序进行。std::atomic

c++ - 提供给 std::unique_ptr 的简单自定义删除器 lambda:为什么使用引用捕获默认值 ([&]) 而不是非捕获 ([])?

背景Cppreference:ssectiononstd::unique_ptr显示以下演示,用于向unique_ptr提供自定义删除器实例:std::unique_ptr>p(newD,[&](D*ptr){std::cout在哪里D,就这个问题而言,就像简单的自定义类型一样,比如structD{D(){std::cout此外,上面的引用说明了删除器的以下类型要求:TyperequirementsDeletermustbeFunctionObjectorlvaluereferencetoaFunctionObjectorlvaluereferencetofunction,callab

c++14 unique_ptr 并使 unique_ptr 错误使用已删除函数 'std::unique-ptr'

我有这样的功能..unique_ptrtest(unique_ptr&&node,stringkey){if(!node){returnmake_unique(key);}elsereturnnode;}如果节点为空,我想创建一个节点,或者返回节点。但它错误地说“使用已删除的函数'std::unique_ptr'”。我做错了什么? 最佳答案 问题在于您调用函数的方式。但首先你应该按值接受你的std::unique_ptr,而不是r-reference。然后你需要在调用函数时std::move()你的指针://acceptbyvalu